interface User {
  id: number
  date: string
  name: string
  hasChildren?: boolean
  children?: User[]
}

/**
 * 获取所有具有非空 children 的用户的 id
 * @param datas 用户数组
 * @param maxDepth 最大遍历层数，不传或为0表示无限制
 * @returns 包含所有符合条件的 id 的数组
 */
function getIdsWithChildren(datas: User[], maxDepth?: number): number[] {
  const result: number[] = [];
  
  /**
   * 递归遍历函数
   * @param dataArray 当前层级的用户数组
   * @param currentDepth 当前深度
   */
  function traverse(dataArray: User[], currentDepth: number = 1) {
    // 如果设置了最大深度且当前深度超过最大深度，则停止递归
    if (maxDepth && currentDepth > maxDepth) {
      return;
    }
    
    for (const item of dataArray) {
      // 检查 children 是否存在且不为空数组
      if (item.children && item.children.length > 0) {
        result.push(item.id);
        
        // 递归遍历子节点
        traverse(item.children, currentDepth + 1);
      }
    }
  }
  
  traverse(datas);
  return result;
}

// 测试示例
const tableData: User[] = [
  {
    id: 1,
    date: '2016-05-02',
    name: 'wangxiaohu',
  },
  {
    id: 2,
    date: '2016-05-04',
    name: 'wangxiaohu',
  },
  {
    id: 3,
    date: '2016-05-01',
    name: 'wangxiaohu',
    children: [
      {
        id: 31,
        date: '2016-05-01',
        name: 'wangxiaohu',
        children: [
          {
            id: 311,
            date: '2016-05-01',
            name: 'wangxiaohu',
            children: [
              {
                id: 3111,
                date: '2016-05-01',
                name: 'wangxiaohu',
              }
            ]
          }
        ]
      },
      {
        id: 32,
        date: '2016-05-01',
        name: 'wangxiaohu',
      },
    ],
  },
  {
    id: 4,
    date: '2016-05-03',
    name: 'wangxiaohu',
  },
];

// 测试不同情况
console.log('无层数限制:', getIdsWithChildren(tableData)); 
// 输出: [3, 31, 311]

console.log('限制1层:', getIdsWithChildren(tableData, 1)); 
// 输出: [3]

console.log('限制2层:', getIdsWithChildren(tableData, 2)); 
// 输出: [3, 31]

console.log('限制3层:', getIdsWithChildren(tableData, 3)); 
// 输出: [3, 31, 311]

console.log('空数组:', getIdsWithChildren([])); 
// 输出: []